diff -ur wine-0.9.31.old/dlls/wined3d/device.c wine-0.9.31/dlls/wined3d/device.c
--- wine-0.9.31.old/dlls/wined3d/device.c	2007-02-16 15:48:13.000000000 +0100
+++ wine-0.9.31/dlls/wined3d/device.c	2007-02-24 23:20:56.000000000 +0100
@@ -295,6 +296,8 @@
 
         if(This->contexts) ERR("Context array not freed!\n");
 
+        if (This->hardwareCursor) DestroyCursor(This->hardwareCursor);
+
         IWineD3D_Release(This->wineD3D);
         This->wineD3D = NULL;
         HeapFree(GetProcessHeap(), 0, This);
@@ -593,7 +596,6 @@
     return WINED3D_OK;
 }
 
-
 /* ************************************
 MSDN:
 [in] Render targets are not lockable unless the application specifies TRUE for Lockable. Note that lockable render targets reduce performance on some graphics hardware.
@@ -5212,6 +5214,9 @@
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
     /* TODO: the use of Impl is deprecated. */
     IWineD3DSurfaceImpl * pSur = (IWineD3DSurfaceImpl *) pCursorBitmap;
+    ICONINFO cursorInfo;
+    WINED3DLOCKED_RECT lockedRect;
+    HCURSOR cursor;
 
     TRACE("(%p) : Spot Pos(%u,%u)\n", This, XHotSpot, YHotSpot);
 
@@ -5223,6 +5228,11 @@
         This->cursorTexture = 0;
     }
 
+    if ( (pSur->currentDesc.Width == 32) && (pSur->currentDesc.Height == 32) )
+        This->haveHardwareCursor = TRUE;
+    else
+        This->haveHardwareCursor = FALSE;
+
     if(pCursorBitmap) {
         /* MSDN: Cursor must be A8R8G8B8 */
         if (WINED3DFMT_A8R8G8B8 != pSur->resource.format) {
@@ -5236,22 +5246,46 @@
             ERR("(%p) : Surface(%p) is %dx%d pixels, but screen res is %dx%d\n", This, pSur, pSur->currentDesc.Width, pSur->currentDesc.Height, This->ddraw_width, This->ddraw_height);
             return WINED3DERR_INVALIDCALL;
         }
-
-        /* TODO: MSDN: Cursor sizes must be a power of 2 */
-        /* This is to tell our texture code to load a SCRATCH surface. This allows us to use out
-         * Texture and Blitting code to draw the cursor
-         */
-        pSur->Flags |= SFLAG_FORCELOAD;
-        IWineD3DSurface_PreLoad(pCursorBitmap);
-        pSur->Flags &= ~SFLAG_FORCELOAD;
-        /* Do not store the surface's pointer because the application may release
-         * it after setting the cursor image. Windows doesn't addref the set surface, so we can't
-         * do this either without creating circular refcount dependencies. Copy out the gl texture instead.
-         */
-        This->cursorTexture = pSur->glDescription.textureName;
-        This->cursorWidth = pSur->currentDesc.Width;
-        This->cursorHeight = pSur->currentDesc.Height;
-        pSur->glDescription.textureName = 0; /* Prevent the texture from being changed or deleted */
+        
+        if (!This->haveHardwareCursor) {
+            /* TODO: MSDN: Cursor sizes must be a power of 2 */
+            /* This is to tell our texture code to load a SCRATCH surface. This allows us to use our
+             * Texture and Blitting code to draw the cursor
+             */
+            pSur->Flags |= SFLAG_FORCELOAD;
+            IWineD3DSurface_PreLoad(pCursorBitmap);
+            pSur->Flags &= ~SFLAG_FORCELOAD;
+            /* Do not store the surface's pointer because the application may release
+             * it after setting the cursor image. Windows doesn't addref the set surface, so we can't
+             * do this either without creating circular refcount dependencies. Copy out the gl texture instead.
+             */
+            This->cursorTexture = pSur->glDescription.textureName;
+            This->cursorWidth = pSur->currentDesc.Width;
+            This->cursorHeight = pSur->currentDesc.Height;
+            pSur->glDescription.textureName = 0; /* Prevent the texture from being changed or deleted */
+        } else {
+            /* Draw a hardware cursor */
+            IWineD3DSurface_LockRect(pCursorBitmap, &lockedRect, NULL, 
+                                     WINED3DLOCK_NO_DIRTY_UPDATE |
+                                     WINED3DLOCK_NOSYSLOCK       |
+                                     WINED3DLOCK_READONLY
+            );
+            TRACE("width: %i height: %i\n", pSur->currentDesc.Width, 
+                  pSur->currentDesc.Height);
+
+            cursorInfo.fIcon = FALSE;
+            cursorInfo.xHotspot = XHotSpot;
+            cursorInfo.yHotspot = YHotSpot;
+            cursorInfo.hbmMask = NULL; /* FIXME:Implement this correctly.*/
+            cursorInfo.hbmColor = CreateBitmap(pSur->currentDesc.Width, 
+                                                pSur->currentDesc.Height, 1, 
+                                                32, lockedRect.pBits);
+            IWineD3DSurface_UnlockRect(pCursorBitmap);
+            cursor = CreateIconIndirect(&cursorInfo);
+            SetCursor(cursor);
+            if (This->hardwareCursor) DestroyCursor(This->hardwareCursor);
+            This->hardwareCursor = cursor;
+        }
     }
 
     This->xHotSpot = XHotSpot;
@@ -5278,6 +5312,13 @@
     if(This->cursorTexture)
         This->bCursorVisible = bShow;
 
+    if (This->haveHardwareCursor) {
+        if (bShow)
+            SetCursor(This->hardwareCursor);
+        else
+            SetCursor(NULL);
+    }
+
     return oldVisible;
 }
 
diff -ur wine-0.9.31.old/dlls/wined3d/directx.c wine-0.9.31/dlls/wined3d/directx.c
--- wine-0.9.31.old/dlls/wined3d/directx.c	2007-02-16 15:48:13.000000000 +0100
+++ wine-0.9.31/dlls/wined3d/directx.c	2007-02-24 22:38:03.000000000 +0100
@@ -1861,8 +1861,8 @@
     *pCaps->Caps3                   = 0;
     *pCaps->PresentationIntervals   = WINED3DPRESENT_INTERVAL_IMMEDIATE;
 
-    *pCaps->CursorCaps              = 0;
-
+    *pCaps->CursorCaps              = WINED3DCURSORCAPS_COLOR            |
+                                      WINED3DCURSORCAPS_LOWRES;
 
     *pCaps->DevCaps                 = WINED3DDEVCAPS_FLOATTLVERTEX       |
                                       WINED3DDEVCAPS_EXECUTESYSTEMMEMORY |
diff -ur wine-0.9.31.old/dlls/wined3d/wined3d_private.h wine-0.9.31/dlls/wined3d/wined3d_private.h
--- wine-0.9.31.old/dlls/wined3d/wined3d_private.h	2007-02-16 15:48:13.000000000 +0100
+++ wine-0.9.31/dlls/wined3d/wined3d_private.h	2007-02-24 22:38:03.000000000 +0100
@@ -642,6 +642,8 @@
     UINT                    yScreenSpace;
     UINT                    cursorWidth, cursorHeight;
     GLuint                  cursorTexture;
+    BOOL                    haveHardwareCursor;
+    HCURSOR                 hardwareCursor;
 
     /* Textures for when no other textures are mapped */
     UINT                          dummyTextureName[MAX_TEXTURES];
diff -ur wine-0.9.31.old/include/wine/wined3d_types.h wine-0.9.31/include/wine/wined3d_types.h
--- wine-0.9.31.old/include/wine/wined3d_types.h	2007-02-16 15:48:13.000000000 +0100
+++ wine-0.9.31/include/wine/wined3d_types.h	2007-02-24 22:38:03.000000000 +0100
@@ -1467,6 +1467,9 @@
 #define WINED3DVTXPCAPS_TEXGEN_SPHEREMAP             0x00000100L
 #define WINED3DVTXPCAPS_NO_TEXGEN_NONLOCALVIEWER     0x00000200L
 
+#define WINED3DCURSORCAPS_COLOR                      0x000000001
+#define WINED3DCURSORCAPS_LOWRES                     0x000000002
+
 #define WINED3DDEVCAPS_FLOATTLVERTEX                 0x000000001
 #define WINED3DDEVCAPS_SORTINCREASINGZ               0x000000002
 #define WINED3DDEVCAPS_SORTDECREASINGZ               0X000000004
